package com.szrt.socket.ch02.tcp.demo01;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import org.junit.Test;

/**
 * 使用tcp协议让客户端给服务端发送消息。服务端把消息输出到控制台。
 * 网络编程其实就是socket的编程
 * day20_06基于TCP_IP协议的网络编程例1_例2
 * @author scott
 *
 */
public class TCPTest {
	
	
	/**
	 * 客户端
	 */
	@Test
	public void client(){
		
		Socket socket   = null;
		OutputStream os = null;
		try {
			//1 创建1个Socket的对象。通过构造器指出服务端的ip地址以及接收的端口号。
			socket = new Socket(InetAddress.getByName("127.0.0.1"), 9091);
			
			//2 得到输出流。
			os = socket.getOutputStream();
			
			//3 调用write方法并以流的形式往服务端发送数据
			os.write("client:hello tcp...".getBytes());
		}catch (IOException e) {
			e.printStackTrace();
		}finally{
			
			//4 关闭输出流
			if(os != null){
				try {
					os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
			//5 关闭socket
			if(socket != null){
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	
	/**
	 * 服务端
	 */
	@Test
	public void server(){
		ServerSocket ss = null;
		Socket socket = null;
		InputStream is = null;
		try {
			
			//1 创建1个ServerSocket的对象。并且通过构造器指明接收的端口号。备注：ip地址不用指定。会自动获取
			ss = new ServerSocket(9091);
			System.out.println("服务端启动了...");
			
			//2 调用serverSocket的accept方法。返回1个Scoket的对象
			socket = ss.accept();
			System.out.println("开始接受到客户端的消息...");
			System.out.println(ss.getInetAddress().getHostAddress());
			
			//3 得到输入流
			is = socket.getInputStream();
			System.out.println(is.getClass());
			
			//4 把输入流中的信息打印到控制台
			byte[] b = new byte[20];
			int len;
			while((len =is.read(b))!=-1){
				String s= new String(b,0,len);
				System.out.print(s);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			//5 关闭3个资源
			if(is != null){
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
			if(socket != null){
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
			if(ss != null){
				try {
					ss.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

}
